package db.sqldao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import db.DBManager;
import db.domain.User;

/**
 * 实现对用户对象和数据库之间的增删改查操作
 * 
 * @author 马远志
 * @date 2011-03-04
 * @version 1.0.0.0
 * 
 */
public class UserSqlDao {
	/**
	 * 实现用户的添加操作
	 * 
	 * @param user用户对象
	 * @return添加成功返回true，否则返回false
	 */
	public boolean addUser(User user) {
		// 定义数据库连接对象
		Connection conn = null;
		// 定义执行SQL语句的装载器
		PreparedStatement stm = null;
		// 定义字符串
		String sql = "insert into t_user(name,password) values (?,?)";
		try {
			// （1）创建数据库连接
			conn = DBManager.getConnection();
			// （2）将SQL语句添加到装载器中
			stm = conn.prepareStatement(sql);
			// （3）给参数进行赋值
			stm.setString(1, user.getName());// 姓名
			stm.setString(2, user.getPassword());// 密码
			// （4）执行SQL
			stm.execute();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			// （5）关闭数据库的连接
			try {
				stm.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {

	}

	/**
	 * 根据主键，修改用户信息
	 * 
	 * @param user用户对象
	 * @return修改成功返回true，否则返回false
	 */
	public boolean updateUser(User user) {
		// 定义数据库连接对象
		Connection conn = null;
		// 定义执行SQL语句的装载器
		PreparedStatement stm = null;
		// 定义字符串
		String sql = "update t_user set name=?,password=? where no=?";
		try {
			// （1）创建数据库连接
			conn = DBManager.getConnection();
			// （2）将SQL语句添加到装载器中
			stm = conn.prepareStatement(sql);
			// （3）给参数进行赋值
			stm.setInt(3, user.getNo());// 编号
			stm.setString(1, user.getName());// 姓名
			stm.setString(2, user.getPassword());// 密码
			// （4）执行SQL
			stm.executeUpdate();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			// （5）关闭数据库的连接
			try {
				stm.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据主键，删除；用户信息
	 * 
	 * @param no学号
	 * @return删除成功返回true，否则返回false
	 */
	public boolean deleteUser(int no) {
		// 定义数据库连接对象
		Connection conn = null;
		// 定义执行SQL语句的装载器
		PreparedStatement stm = null;
		// 定义字符串
		String sql = "delete from t_user where no=?";
		try {
			// （1）创建数据库连接
			conn = DBManager.getConnection();
			// （2）将SQL语句添加到装载器中
			stm = conn.prepareStatement(sql);
			// （3）给参数进行赋值
			stm.setInt(1, no);// 学号
			// （4）执行SQL
			stm.execute();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			// （5）关闭数据库的连接
			try {
				stm.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 根据主键，查询用户信息
	 * 
	 * @param no编号
	 * @return返回对象，如果没有数据返回null
	 */
	public User getUser(int no) {
		// 定义数据库连接对象
		Connection conn = null;
		// 定义执行SQL语句的装载器
		PreparedStatement stm = null;
		// 定义字符串
		String sql = "select * from t_user where no=?";
		// 定义结果集
		ResultSet rs = null;
		// 定义用户对象
		User user = null;
		try {
			// （1）创建数据库连接
			conn = DBManager.getConnection();
			// （2）将SQL语句添加到装载器中
			stm = conn.prepareStatement(sql);
			// （3）给参数进行赋值
			stm.setInt(1, no);// 学号
			// （4）执行SQL
			rs = stm.executeQuery();
			while (rs.next()) {
				user = new User();
				user.setNo(rs.getInt("no"));
				user.setName(rs.getString("name"));

				user.setPassword(rs.getString("password"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// （5）关闭数据库的连接
			try {
				rs.close();
				stm.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return user;
	}

	/**
	 * 根据指定查询条件，查询用户信息
	 * 
	 * @param whereSQL查询条件
	 * @return
	 */
	public ArrayList<User> getUser(String whereSQL) {
		// 定义数据库连接对象
		Connection conn = null;
		// 定义执行SQL语句的装载器
		PreparedStatement stm = null;
		// 定义字符串
		String sql = "select * from t_user " + whereSQL;
		// 定义结果集
		ResultSet rs = null;
		// 定义用户对象集合
		ArrayList<User> users = new ArrayList<User>();
		try {
			// （1）创建数据库连接
			conn = DBManager.getConnection();
			// （2）将SQL语句添加到装载器中
			stm = conn.prepareStatement(sql);
			// （3）给参数进行赋值

			// （4）执行SQL
			rs = stm.executeQuery();
			while (rs.next()) {
				User user = new User();
				user.setNo(rs.getInt("no"));
				user.setName(rs.getString("name"));
				user.setPassword(rs.getString("password"));
				users.add(user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// （5）关闭数据库的连接
			try {
				rs.close();
				stm.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return users;
	}

	/**
	 * 根据指定的查询条件，查询用户信息
	 * 
	 * @param whereSQL查询条件
	 * @return
	 */
	public ArrayList<User> getUser(String whereSQL, int start, int end) {
		// 定义数据库连接对象
		Connection conn = null;
		// 定义执行SQL语句的装载器
		PreparedStatement stm = null;
		// 定义字符串
		String sql = "select * from t_user " + whereSQL;
		// 定义结果集
		ResultSet rs = null;
		// 定义用户对象集合
		ArrayList<User> users = new ArrayList<User>();
		try {
			// （1）创建数据库连接
			conn = DBManager.getConnection();
			// （2）将SQL语句添加到装载器中
			stm = conn.prepareStatement(sql);
			// （3）给参数进行赋值
			// （4）执行SQL
			rs = stm.executeQuery();
			if (start > 1) {
				rs.absolute(start - 1);// 改变游标的位置
			}
			for (int i = start; i <= end; i++) {
				if (rs.next()) {
					User user = new User();
					user.setNo(rs.getInt("no"));
					user.setName(rs.getString("name"));
					user.setPassword(rs.getString("password"));
					users.add(user);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// （5）关闭数据库的连接
			try {
				rs.close();
				stm.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return users;
	}

	/**
	 * 根据查询条件，返回对应记录的总条数
	 * 
	 * @param whereSql查询条件
	 * @return
	 */
	public int getAllUsers(String whereSql) {
		// 定义数据库连接对象
		Connection conn = null;
		// 定义执行SQL语句的装载器
		PreparedStatement stm = null;
		// 定义字符串
		String sql = "select count(*) as count from t_user " + whereSql;
		// 定义结果集
		ResultSet rs = null;
		int count = 0;
		try {
			// （1）创建数据库连接
			conn = DBManager.getConnection();
			// （2）将SQL语句添加到装载器中
			stm = conn.prepareStatement(sql);
			// （4）执行SQL
			rs = stm.executeQuery();
			while (rs.next()) {
				count = rs.getInt("count");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// （5）关闭数据库的连接
			try {
				rs.close();
				stm.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return count;
	}

}
